﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace TP2.Lib
{
     [Serializable]
    public class Caza : AvionEnemigo
    {
        const int VIDA_MAX_CAZA = 25,
                  VIDA_CAZA = 25,
                  RAPIDEZ_CAZA = 2,
                  RADIO_CAZA = 15,
                  PTOS_X_DESTRUC_CAZA = 30,
                  DELTA_TIEMPO = 70;

        private Caza() { } /*Contructor vacio, lo utiliza la serialización*/

        public Caza(double[] posicionInicial, double[] posicionFinal, int[] dimensiones):base(posicionInicial,dimensiones)
        {
            LanzaTorpedoSimple lanzaTorpedoS = new LanzaTorpedoSimple(posicionInicial,dimensiones);
            this.AgregarArma(lanzaTorpedoS);
            this.EsGuia = false;
            this.VidaMaxima = VIDA_MAX_CAZA;
            this.Vida = VIDA_CAZA;
            this.Rapidez = RAPIDEZ_CAZA;
            this.Radio = RADIO_CAZA;
            this.PuntosPorDestruccion = PTOS_X_DESTRUC_CAZA;
            this.EstaHuyendo = false;
            this.Recorrido = new MovimientoLineal(posicionInicial, posicionFinal, this.Rapidez);
            this.FlotaALaQuePertenece = null;
        }

        /*Metodos abstractos heredados: obligados a definirlos*/

        public override Proyectil Actuar()
        {
            this.Mover();

            VariableDisparo = VariableDisparo + 1;
            if ((!this.EstaHuyendo) & (this.VariableDisparo > DELTA_TIEMPO))
            {
                Proyectil unProyectil = this.Disparar();
                VariableDisparo = 0;
                if (unProyectil != null)
                {
                    unProyectil.VengoDeEnemigo = true;
                    return unProyectil;
                }
            }

            return null;
        }

        public override ElementoJuego MeMori()
        {
            TanqueEnergia nuevoTanque = new TanqueEnergia( this.Posicion,this.Dimensiones);
            nuevoTanque.Posicion = this.Posicion;
            return (nuevoTanque);
        }

        //public override void AgregateALista(ArrayList lista1, ArrayList lista2)
        //{
        //    lista2.Add(this);
        //}

        #region /*------ Metodos Privados -----*/

        private Proyectil Disparar()
        {
            double[] posicionInicial = new double[3];
            double[] posicionFinal = new double[3];

            Proyectil proyectil;

            posicionInicial[0] = this.Posicion[0];
            posicionInicial[1] = this.Posicion[1];

            posicionFinal[0] = this.Posicion[0];
            posicionFinal[1] = this.Dimensiones[1]; // Cambie 0 por this.Dimensiones[1]
            proyectil = this.Armas.ElementAt(0).Disparar(posicionInicial, posicionFinal);
            return (proyectil);
        }

        private void Mover()
        {
            double[] posicion = new double[3];
            posicion = this.Recorrido.GetSiguientePunto(this.Posicion);

            if ((((MovimientoLineal)this.Recorrido).PosicionInicial == this.Posicion) || (((MovimientoLineal)this.Recorrido).PosicionFinal == this.Posicion))
            {
                ((MovimientoLineal)this.Recorrido).VelocidadX = (((MovimientoLineal)this.Recorrido).VelocidadX) * (-1);
                ((MovimientoLineal)this.Recorrido).VelocidadY = (((MovimientoLineal)this.Recorrido).VelocidadY) * (-1);
            }

            this.Posicion = posicion;
        }

        #endregion
    }
}
